package com.ssy.lingxi.order.service.feign;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.model.dto.OrderCouponDetailDTO;
import com.ssy.lingxi.order.model.dto.OrderProductDetailDTO;
import com.ssy.lingxi.order.model.dto.PromotionNotifyDTO;
import com.ssy.lingxi.order.model.dto.PromotionProductDTO;
import com.ssy.lingxi.order.model.vo.basic.request.MobileOrderProductVO;
import com.ssy.lingxi.order.model.vo.basic.request.OrderCouponVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 营销服务Feign接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-10-27
 */
public interface IMarketingFeignService {
    /**
     * 查询订单促销活动、优惠券、商品到手价（含赠品，套餐，订单商品参与的活动列表）
     * @param shopId 订单来源商城Id
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId 采购会员角色Id
     * @param buyerMemberLevelType 当前用户（采购会员）等级类型
     * @param products   商品信息列表（改变并返回）
     * @return 查询结果
     */
    Wrapper<List<PromotionProductDTO>> findOrderPromotions(Long shopId, Long buyerMemberId, Long buyerRoleId, Integer buyerMemberLevelType, List<OrderProductDetailDTO> products);

    /**
     * 查询拼团订单促销活动、商品到手价
     * @param shopId 订单来源商城Id
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId 采购会员角色Id
     * @param buyerMemberLevelType 当前用户（采购会员）等级类型
     * @param products  订单商品信息
     * @return 查询结果
     */
    Wrapper<List<PromotionProductDTO>> findGroupOrderPromotions(Long shopId, Long buyerMemberId, Long buyerRoleId, Integer buyerMemberLevelType, List<MobileOrderProductVO> products);

    /**
     * 查询优惠券列表
     * @param shopId       订单来源商城Id
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param orderCoupons 接口参数中的优惠券列表
     * @param orderProducts 订单商品列表
     * @param promotionAmount 根据营销活动到手价计算后的商品总价
     * @return 优惠券列表
     */
    Wrapper<List<OrderCouponDetailDTO>> findOrderCoupons(Long shopId, Long buyerMemberId, Long buyerRoleId, List<OrderCouponVO> orderCoupons, List<OrderProductDetailDTO> orderProducts, BigDecimal promotionAmount);

    /**
     * 订单创建完成后、取消订单时，修改营销活动记录
     * @param orderId       订单Id
     * @param createTime    订单创建时间
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param buyerMemberName 采购会员名称
     * @param shopId          订单来源商城Id
     * @param shopName        订单来源商城名称
     * @param promotionProducts 商品及营销活动列表
     */
    void updateOrderPromotions(Long orderId, LocalDateTime createTime, Long buyerMemberId, Long buyerRoleId, String buyerMemberName, Long shopId, String shopName, List<PromotionNotifyDTO> promotionProducts);

    /**
     * 订单创建完成后，消耗优惠券
     * @param shopId      订单来源商城Id
     * @param shopName    订单来源商城名称
     * @param orderId     订单Id
     * @param orderNo     订单编号
     * @param buyerMemberId 采购会员id
     * @param buyerRoleId   采购会员角色id
     * @param buyerMemberName   采购会员名称
     * @param createTime  订单创建时间
     * @param totalAmount 订单金额
     * @param coupons     优惠券列表
     */
    void spendCoupons(Long shopId, String shopName, Long orderId, String orderNo, Long buyerMemberId, Long buyerRoleId, String buyerMemberName, LocalDateTime createTime, BigDecimal totalAmount, List<OrderCouponDetailDTO> coupons);

    /**
     * 取消订单后，返还优惠券
     * @param coupons 优惠券列表
     */
    void resumeCoupons(List<OrderCouponDetailDTO> coupons);

    /**
     * 当拼团订单处于“待发货”状态时，通知营销服务，记录拼团订单
     * @param orderId 订单Id
     * @param orderNo 订单号
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param buyerMemberName 采购会员名称
     * @param buyerMemberLogo 采购会员Logo
     * @param productId 拼团商品Id
     * @param skuId     拼团商品SkuId
     * @param quantity  拼团商品数量
     * @param promotionId 拼团活动Id
     * @param recordId    拼团活动记录Id
     * @param belongType  活动归属类型
     */
   Wrapper<Long> notifyGroupOrder(Long orderId, String orderNo, Long buyerMemberId, Long buyerRoleId, String buyerMemberName, String buyerMemberLogo, Long productId, Long skuId, BigDecimal quantity, Long promotionId, Long recordId, Integer belongType);

    /**
     * 校验采购会员是否能参与拼团（自建的拼团）
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param groupId       拼团Id
     * @return 查询结果
     */
   Wrapper<Boolean> checkGroupOrder(Long buyerMemberId, Long buyerRoleId, Long groupId);
}
